package com.hspedu.polymorphic_.polyparameter;

/**
 * 多态参数：
 * 方法定义的形参类型为父类类型，实参类型允许为子类类型
 * 应用1：前面的主人喂食宠物
 * 应用2：1.定义员工类Employee，包含姓名和月工资[private]，以及机选年工资getAnnual的方法，
 *       普通员工和经理继承了员工，经理类多了奖金bonus属性和管理manage方法，
 *       普通员工类多了work方法，普通员工和经理类要求分别重写getAnnual方法
 *       2.测试类中添加一个方法showEmpAnnual(Employee e), 实现获取任何员工对象的年工资，
 *       并在main方法中调用该方法[e.getAnnual()]
 *       3.测试类中添加一个方法testWork(Employee e),
 *       如果是普通员工，则调用work方法，如果是经理，则调用manage方法
 *
 */
public class PolyParameter {
    public static void main(String[] args) {
        Worker tom = new Worker("tom", 2500);
        Manager milan = new Manager("milan", 5000, 200000);
        PolyParameter polyParameter = new PolyParameter();
        polyParameter.showEmpAnnual(tom);
        polyParameter.showEmpAnnual(milan);

        polyParameter.testWork(tom);
        polyParameter.testWork(milan);
    }
    //获取任何员工对象的年工资
    void showEmpAnnual(Employee e){
        //动态绑定机制，调用子类的getAnnual方法，经理调用经理的getAnnual，工人调用工人的getAnnual
        System.out.println(e.getAnnual());
    }
    //如果是普通员工，则调用work方法，如果是经理，则调用manage方法
    void testWork(Employee e){
        if (e instanceof Worker){
            ((Worker) e).work();
        }else if (e instanceof Manager){
            ((Manager) e).manage();
        }else{
            System.out.println("不做处理");
        }
    }
}
